package com.hb.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import javax.servlet.Filter;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration;

/**
 * getServletConfigClasses()，getRootConfigClasses()，getServletMappings() 这三个方法是必须要重载的 abstract 方法。但实际上还有更多的方法可以进行重载，从而实现额外的配置
 */
public class SpittrWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getServletConfigClasses() {
        // 这里的 WebConfig 类是创建 DispatcherServlet 要用的应用上下文，并不是 DispatcherServlet 自身的配置
        return new Class<?>[]{WebConfig.class};
    }

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{RootConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    /**
     * 在 AbstractAnnotationConfigDispatcherServletInitializer 将 DispatcherServlet 注册到 Servlet 容器中之后，就会调用 customizeRegistration()，
     * 并将 Servlet 注册后得到的 Registration.Dynamic 传递进来。通过重载 customizeRegistration() 方法，我们可以对 DispatcherServlet 进行额外的配置
     * @param registration
     */
    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        // 1、如果计划使用 Servlet 3.0 对 multipart 配置的支持，那么需要使用 DispatcherServlet 的 registration 来启用 multipart 请求。我们可以重
        // 载 customizeRegistration() 方法来设置 MultipartConfigElement。通过调用 setMultipartConfig() 配置 Servlet 3.0 对 multipart 的支持。
        // 2、在下面的代码中，我们设置了对 multipart 的支持，将上传文件的临时存储目录设置在 “/tmp/spittr/uploads” 中
        // 3、还可以通过 MultipartConfigElement 类的其他构造器来限制上传文件的大小。除了临时路径的位置，其他的构造器所能接受的参数如下：
        // ① 上传文件的最大容量（以字节为单位）。默认是没有限制的。
        // ② 整个 multipart 请求的最大容量（以字节为单位），不会关心有多少个 part 以及每个 part 的大小。默认是没有限制的。
        // ③ 在上传的过程中，如果文件大小达到了一个指定最大容量（以字节为单位），将会写入到临时文件路径中。默认值为0，也就是所有上传的文件都会写入到磁盘上。
//        registration.setMultipartConfig(new MultipartConfigElement("/tmp/spittr/uploads"));
        // 下面的代码表示我们想限制文件的大小不超过 2MB，整个请求不超过 4MB，而且所有的文件都要写到磁盘中
        registration.setMultipartConfig(new MultipartConfigElement("/", 2097152, 4194304, 0));
    }

    /**
     * 如果只是注册 Filter，并且该 Filter 只会映射到 DispatcherServlet 上的话，那么在 AbstractAnnotationConfigDispatcherServletInitializer
     * 中还有一种快捷方式。为了注册 Filter 并将其映射到 DispatcherServlet，所需要做的仅仅是重载 AbstractAnnotationConfigDispatcherServletInitializer
     * 的 getServletFilters() 方法
     */
//    @Override
//    protected Filter[] getServletFilters() {
//        // 在这里没有必要声明它的映射路径，getServletFilters() 方法返回的所有 Filter 都会映射到 DispatcherServlet 上
//        return new Filter[] {new MyFilter()};
//    }
}
